package leetcodehot100;


public class _2两数相加 {

    class ListNode {
        int val;
        ListNode next;
        ListNode() {}
        ListNode(int val) { this.val = val; }
        ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    }

    /**
     * 给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
     */
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode sum = new ListNode(-1);
        ListNode cur = sum;
        int ans = 0;
        while (l1!=null && l2!=null){
            int val1 = l1.val;
            int val2 = l2.val;
            int res = val1+val2+ans;
            if(res>=10){
                ans = 1;
                res = res %10 ;
            }else{
                ans = 0;
            }
            cur.next = new ListNode(res);
            cur = cur.next;
            l1 = l1.next;
            l2 = l2.next;
        }
        while (l1!=null){
            int res = l1.val+ans;
            if(res>=10){
                ans = 1;
                res = res %10 ;
            }else{
                ans = 0;
            }
            cur.next = new ListNode(res);
            cur = cur.next;
            l1 = l1.next;
        }
        while (l2!=null){
            int res = l2.val+ans;
            if(res>=10){
                ans = 1;
                res = res %10 ;
            }else{
                ans = 0;
            }
            cur.next = new ListNode(res);
            cur = cur.next;
            l2 = l2.next;
        }
        if(ans==1)
            cur.next = new ListNode(1);
            cur = cur.next;
        return  sum.next;
    }

    public ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
        ListNode head = null, tail = null;
        int carry = 0;
        while (l1 != null || l2 != null) {
            int n1 = l1 != null ? l1.val : 0;
            int n2 = l2 != null ? l2.val : 0;
            int sum = n1 + n2 + carry;
            if (head == null) {
                head = tail = new ListNode(sum % 10);
            } else {
                tail.next = new ListNode(sum % 10);
                tail = tail.next;
            }
            carry = sum / 10;
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        if (carry > 0) {
            tail.next = new ListNode(carry);
        }
        return head;
    }
}
